home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2007 March
/
PCWorld_2007-03_cd.bin
/
domacnost a kancelar
/
scribus
/
scribus-1.3.3.7-win32-install.exe
/
tcl
/
tix8.1
/
UnixFile.tcl
< prev
next >
Wrap
Text File
|
2001-11-03
|
8KB
|
413 lines
# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
#
# $Id: UnixFile.tcl,v 1.4.2.1 2001/11/03 07:25:12 idiscovery Exp $
#
# UnixFile.tcl --
#
# Unix file access portibility routines.
#
# Copyright (c) 1993-1999 Ioi Kim Lam.
# Copyright (c) 2000-2001 Tix Project Group.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
proc tixInitFileCmpt:Unix {} {
# tixFSSplit --
#
# Splits a directory into its hierarchical components
#
# "hlist-type hierachical path" <- "vpath"
# "name"
# "directory name" <- "path"
#
proc tixFSSplit {dir} {
if {[string compare [tixFSPathType $dir] "absolute"]} {
error "$dir must be an absolute path"
}
set path ""
set p ""
foreach d [tixFileSplit $dir] {
set p [tixFSJoin $p $d]
lappend path [list $p $d $p]
}
return $path
}
# returns true if $dir is an valid path (always true in Unix)
#
proc tixFSValid {dir} {
return 1
}
# Directory separator
#
proc tixFSSep {} {
return "/"
}
# tixFSIntName
#
# Returns the "virtual path" of a filename
#
proc tixFSIntName {dir} {
if {[string compare [tixFSPathType $dir] "absolute"]} {
error "$dir must be an absolute path"
}
return $dir
}
proc tixFSResolveName {p} {
return $p
}
# These subcommands of "file" only exist in Tcl 7.5+. We define the following
# wrappers so that the code also works under Tcl 7.4
#
global tcl_version
if {![string compare $tcl_version 7.4]} {
proc tixFSPathType {dir} {
if {![string compare [string index $dir 0] /]} {
return "absolute"
}
if {![string compare [string index $dir 0] ~]} {
return "absolute"
}
return "relative"
}
proc tixFSJoin {dir sub} {
set joined $dir/$sub
regsub -all {[/]+} $joined / joined
return $joined
}
} else {
proc tixFSPathType {dir} {
return [file pathtype $dir]
}
proc tixFSJoin {dir sub} {
return [file join $dir $sub]
}
}
# dir: Make a listing of this directory
# showSubDir: Want to list the subdirectories?
# showFile: Want to list the non-directory files in this directory?
# showPrevDir: Want to list ".." as well?
# showHidden: Want to list the hidden files?
#
# return value: a list of files and/or subdirectories
#
proc tixFSListDir {dir showSubDir showFile showPrevDir showHidden {pattern ""}} {
set appPWD [pwd]
if {[catch {cd $dir} err]} {
# The user has entered an invalid directory
# %% todo: prompt error, go back to last succeed directory
cd $appPWD
return ""
}
if {$pattern == ""} {
if $showHidden {
set pattern "* .*"
} else {
set pattern *
}
} elseif {$pattern == "*"} {
if $showHidden {
set pattern "* .*"
}
}
set list ""
foreach pat $pattern {
if {[catch {set names [lsort [glob -nocomplain $pat]]} err]} {
# Cannot read directory
# %% todo: show directory permission denied
continue
}
catch {
# We are catch'ing, just in case the "file" command
# returns unexpected errors
#
foreach fname $names {
if {![string compare . $fname]} {
continue
}
if {[file isdirectory $fname]} {
if {![string compare ".." $fname] && !$showPrevDir} {
continue
}
if $showSubDir {
lappend list [file tail $fname]
}
} else {
if $showFile {
lappend list [file tail $fname]
}
}
}
}
}
cd $appPWD
if {[llength $pattern] > 1} {
# get rid of duplicated names
#
set list1 ""
set oldfile ""
foreach name [lsort $list] {
if {$name == $oldfile} {
continue
}
lappend list1 $name
set oldfile $name
}
return [_tixFSMakeList $dir $list1]
} else {
return [_tixFSMakeList $dir $list]
}
}
# _tixFSMakeList -
#
# Internal procedure. Used only by tixFSListDir
proc _tixFSMakeList {dir list} {
set l ""
foreach file $list {
set path [tixFSJoin $dir $file]
lappend l [list $path $file $path]
}
return $l
}
# Directory separator
#
proc tixDirSep {} {
return "/"
}
# tixFSInfo --
#
# Returns information about the file system of this OS
#
# hasdrives: Boolean
# Does this file system support seperate disk drives?
#
proc tixFSInfo {args} {
case [lindex $args 0] {
hasdrives {
return 0
}
}
}
#----------------------------------------------------------------------
# Obsolete
#----------------------------------------------------------------------
# nativeName: native filename used in this OS, comes from the user or
# application programmer
# defParent: if the filename is not an absolute path, treat it as a
# subfolder of $defParent
proc tixFileIntName {nativeName {defParent ""}} {
if {![tixIsAbsPath $nativeName]} {
if {$defParent != ""} {
set path [tixSubFolder $defParent $nativeName]
} else {
set path $nativeName
}
} else {
set path $nativeName
}
set intName ""
set path [tixFile trimslash [tixFile tildesubst $path]]
foreach name [tixFileSplit $path] {
set intName [tixSubFolder $intName $name]
}
return $intName
}
proc tixNativeName {name {mustBeAbs ""}} {
return $name
}
proc tixFileDisplayName {intName} {
if {$intName == "/"} {
return "/"
} else {
return [file tail $intName]
}
}
proc tixFileSplit {intName} {
set l ""
foreach n [split $intName /] {
if {$n == ""} {
continue
}
if {$n == "."} {
continue
}
lappend l $n
}
while {1} {
set idx [lsearch $l ".."]
if {$idx == -1} {
break;
}
set l [lreplace $l [expr $idx -1] $idx]
}
if {[string index $intName 0] == "/"} {
return [concat "/" $l]
} else {
return $l
}
}
proc tixSubFolder {parent sub} {
if {$parent == ""} {
return $sub
}
if {$parent == "/"} {
return /$sub
} else {
return $parent/$sub
}
}
# dir: Make a listing of this directory
# showSubDir: Want to list the subdirectories?
# showFile: Want to list the non-directory files in this directory?
# showPrevDir: Want to list ".." as well?
# showHidden: Want to list the hidden files?
#
# return value: a list of files and/or subdirectories
#
proc tixListDir {dir showSubDir showFile showPrevDir showHidden {pattern ""}} {
set appPWD [pwd]
if {[catch {cd $dir} err]} {
# The user has entered an invalid directory
# %% todo: prompt error, go back to last succeed directory
cd $appPWD
return ""
}
if {$pattern == ""} {
if $showHidden {
set pattern "* .*"
} else {
set pattern *
}
} elseif {$pattern == "*"} {
if $showHidden {
set pattern "* .*"
}
}
set list ""
foreach pat $pattern {
if {[catch {set names [lsort [glob -nocomplain $pat]]} err]} {
# Cannot read directory
# %% todo: show directory permission denied
continue
}
catch {
# We are catch'ing, just in case the "file" command
# returns unexpected errors
#
foreach fname $names {
if {![string compare . $fname]} {
continue
}
if {[file isdirectory $fname]} {
if {![string compare ".." $fname] && !$showPrevDir} {
continue
}
if $showSubDir {
lappend list [file tail $fname]
}
} else {
if $showFile {
lappend list [file tail $fname]
}
}
}
}
}
cd $appPWD
if {[llength $pattern] > 1} {
set list1 ""
set oldfile ""
foreach name [lsort $list] {
if {$name == $oldfile} {
continue
}
lappend list1 $name
set oldfile $name
}
return $list1
} else {
return $list
}
}
# returns the "root directory" of this operating system
#
proc tixRootDir {} {
return "/"
}
proc tixIsAbsPath {nativeName} {
set c [string index $nativeName 0]
if {$c == "~" || $c == "/"} {
return 1
} else {
return 0
}
}
proc tixVerifyFile {file} {
return [tixFileIntName $file]
}
proc tixFilePattern {args} {
if {[lsearch $args allFiles] != -1} {
return *
}
return *
}
}